/*
 * @Author: wangke
 * @Date: 2025-03-13 10:46:16
 * @LastEditors: wangke
 * @LastEditTime: 2025-03-19 23:01:37
 * 
 */
#include "App_Vs1053b.h"
#include <SD.h>
//#include <FS.h>
#include <VS1053.h>

const int SS_PIN = 10;  // 片选引脚
const int SCK_PIN = 14; // 时钟线引脚
const int MOSI_PIN = 13; // 主设备数据输出引脚
const int MISO_PIN = 12; // 主设备数据输入引脚
// VS1053B 引脚定义
#define SD_CE 10
#define VS1053B_CS 5
#define VS1053B_DREQ 4
#define VS1053B_RESET 2
#define VS1053B_XDCS 41

// SPI 时钟频率
#define SPI_CLOCK 4000000

// VS1053B 命令寄存器地址
#define SM_RESET 0x00
#define SM_STATUS 0x02
#define SM_CLOCKF 0x03
#define SM_OUTPTR 0x04
#define SM_READ 0x06
#define SM_WRAMADDR 0x07
#define SM_WRAM 0x08
#define SM_VERSION 0x12
#define SM_MODE 0x0D
#define SM_AUDATA 0x14
// 写入 VS1053B 寄存器
void writeRegister(uint8_t address, uint32_t value) {
  digitalWrite(VS1053B_CS, LOW);
  SPI.transfer(address);
  SPI.transfer(value >> 16);
  SPI.transfer(value >> 8);
  SPI.transfer(value);
  digitalWrite(VS1053B_CS, HIGH);
}

// 初始化 VS1053B
void initVS1053B() {
    pinMode(VS1053B_CS, OUTPUT);
    pinMode(VS1053B_RESET, OUTPUT);
    pinMode(VS1053B_XDCS, OUTPUT);

    digitalWrite(VS1053B_CS, HIGH);
    digitalWrite(VS1053B_XDCS, HIGH);
    digitalWrite(VS1053B_RESET, LOW);
    delay(10);
    digitalWrite(VS1053B_RESET, HIGH);
    delay(10);

    SPI.begin(14, 12, 13, VS1053B_CS); // 设置 SPI 引脚
    SPI.setClockDivider(SPI_CLOCK);

    // 发送复位命令
    SPI.transfer(0x00);
    SPI.transfer(0x01);
    SPI.transfer(0x00);
    SPI.transfer(0x00);

    // 等待复位完成
    delay(100);

    // 设置时钟频率
    writeRegister(SM_CLOCKF, 0x600000);
    // 设置模式寄存器
    writeRegister(SM_MODE, 0x0800);
}


// 从文件中读取音频数据并发送到 VS1053B
void playAudioFile(const char* filename) {
    File file = SD.open("/test.mp3");
    if (!file) {
        Serial.println("无法打开文件");
        return;
    }

    while (file.available()) {
        while (!digitalRead(VS1053B_DREQ)); // 等待 DREQ 变高
        uint8_t buffer[32];
        size_t bytesRead = file.read(buffer, sizeof(buffer));
        SPI.transfer(buffer, bytesRead);
    }

    file.close();
}
// SPIClass spi = SPIClass(HSPI);
// void App_Vs1053Init()
// {
//   spi.begin(SCK_PIN,MISO_PIN,MOSI_PIN,SD_CE);
//   if (!SD.begin(SD_CE,spi,8000000)) {
//     Serial.println("无法初始化 SD 卡");
//     return;
//   }
//   Serial.println("sd init ok");
//   //initVS1053B();
//   // 播放音频文件
//   //playAudioFile("/test.mp3");
// }

// void App_TestSD(void)
// {
//   if (!SD.begin(SD_CE,spi,8000000)) {
//     Serial.println("无法初始化 SD 卡");
//     return;
//   }
// }
